home *** CD-ROM | disk | FTP | other *** search
/ Megarom / Megarom Macintosh CD Software (Quantum Leap)(1992).iso / CDEV⁄RDEV / INITShare ƒ / INIT32.a < prev    next >
Text File  |  1988-06-24  |  7KB  |  280 lines

  1. ; INIT to include a specified folder in the Poor Man's Search Path
  2. ; The Name of the folder is in STR 128
  3.  
  4.  
  5.     INCLUDE     'Traps.a'
  6.     INCLUDE     'ToolEqu.a'
  7.     INCLUDE     'SysEqu.a'
  8.     INCLUDE     'SysErr.a'
  9.  
  10. ;Install the patches to _Open, _OpenRF and _GetFileInfo
  11.  
  12.     Main
  13. init32
  14.     MOVE.L    A0,-(SP)        ;Get the Handle to ourself
  15.     _DetachResource            ;Detach ourself , so we survive
  16.     
  17.     LINK    A6,#-ioHVQElSize    ;Allocate a ParamBlock Record
  18.     
  19.     CLR.L    -(SP)
  20.     MOVE.W    #-4048,-(SP)
  21.     _GetString            ;Get Handle to Folder Name string
  22.     MOVE.L    (SP),A0
  23.     _HLock                ;Lock it
  24.     MOVE.L    (A0),A1            ;Get Pointer to Folder Name string
  25.     
  26.     LEA    -ioHVQElSize(A6),A0    ;Point to Params
  27.     CLR.L    ioCompletion(A0)
  28.     MOVE.L    A1,ioFileName(A0)    ;Point to Folder Name string
  29.     CLR.W    ioVRefNum(A0)
  30.     MOVE.L    #'JGS0',ioWDProcID(A0)
  31.     CLR.L    ioWDDirID(A0)
  32.     _OpenWD                ;Open our Folder as a Working Directory
  33.     BEQ.S    OK
  34.     MOVE.L    (SP)+,A0        ;Folder not found, Clean up string
  35.     _HUnlock
  36.     BRA.S    EndInstall        ;and return without patching
  37.     
  38. OK
  39.     LEA    WDRefNum,A1
  40.     MOVE.W    ioVRefNum(A0),(A1)    ;Save Working Directory Refnum
  41.     
  42.     MOVE.L    (SP)+,A0
  43.     _HUnlock            ;Unlock the Folder Name string
  44.     
  45.     LEA    -ioHVQElSize(A6),A0    ;Point to Params
  46.     CLR.L    ioCompletion(A0)
  47.     CLR.L    ioFileName(A0)        ;Clear name pointer
  48.     CLR.W    ioVRefNum(A0)
  49.     CLR.W    ioVolIndex(A0)
  50.     _HGetVInfo            ;Get volume info
  51.     BNE.S    EndInstall
  52.     LEA    BlVRefNum,A1
  53.     MOVE.W    ioVRefNum(A0),(A1)    ;Save VRefNum of blessed folder
  54.     LEA    BlDirID,A1
  55.     MOVE.L    ioVFndrInfo(A0),(A1)    ;Save dirID of blessed folder
  56.     
  57.     MOVE.W    #$00,D0            ;Get old _Open address
  58.     _GetTrapAddress
  59.     LEA    OldOpenAdr,A1
  60.     MOVE.L    A0,(A1)            ;Save it for use in the patches
  61.     LEA    NewOpen,A0        ;Point to new _Open
  62.     MOVE.W    #$00,D0            ;Patch the _OpenRF trap
  63.     _SetTrapAddress
  64.  
  65.  
  66.     MOVE.W    #$0A,D0            ;Get old _OpenRF address
  67.     _GetTrapAddress
  68.     LEA    OldOpenRFAdr,A1
  69.     MOVE.L    A0,(A1)            ;Save it for use in the patches
  70.     LEA    NewOpenRF,A0        ;Point to new _OpenRF
  71.     MOVE.W    #$0A,D0            ;Patch the _OpenRF trap
  72.     _SetTrapAddress
  73.  
  74.  
  75.     MOVE.W    #$0C,D0            ;Get old _GetFileInfo address
  76.     _GetTrapAddress
  77.     LEA    OldGetFIAdr,A1
  78.     MOVE.L    A0,(A1)            ;Save it for use in the patches
  79.     LEA    NewGetFI,A0        ;Point to new _GetFileInfo
  80.     MOVE.W    #$0C,D0
  81.     _SetTrapAddress            ;Patch the _GetFileInfo trap
  82.  
  83. EndInstall
  84.     UNLK    A6            ;Clean up stack
  85.     RTS
  86.  
  87.  
  88. ;The New _Open trap
  89.  
  90. NewOpen
  91.     MOVEM.L    A0-A6/D1-D7,-(SP)    ;Save all regs. except D0
  92.     LEA    OldOpenAdr,A2        ;Get the old trap
  93.     MOVE.L    (A2),A2
  94.     JSR    (A2)            ;Do old trap
  95.     MOVEM.L    (SP)+,A0-A6/D1-D7    ;Restore regs.
  96.     
  97.     CMP.W    #fnfErr,D0        ;File Not Found Error in old WD?
  98.     BNE.S    NoOpenErr        ;No, just return
  99.  
  100.     MOVE.W    ioVRefNum(A0),-(SP)    ;Save old RefNum
  101.     MOVE.W    D0,-(SP)        ;Save old Error
  102.     MOVEM.L    A0-A6/D1-D7,-(SP)    ;Save regs.
  103.     
  104.     MOVE.W    WDRefNum,ioVRefNum(A0)    ;Try our WD 
  105.     LEA    OldOpenAdr,A2        ;Get the old trap
  106.     MOVE.L    (A2),A2
  107.     JSR    (A2)            ;Do old trap in our Folder
  108.     
  109.     MOVEM.L    (SP)+,A0-A6/D1-D7    ;Restore regs.
  110.     
  111.     TST.W    D0            ;Error in new WD?
  112.     BEQ.S    @1            ;No, Clean up and return
  113.     MOVE.W    (SP),D0            ;Restore old Error
  114.     MOVE.W    2(SP),ioVRefNum(A0)    ;Restore old VRefNum
  115. @1    ADDQ    #4,SP            ;Clean Stack
  116.  
  117. NoOpenErr
  118.     RTS
  119.  
  120.  
  121. ;The New _OpenRF trap
  122.  
  123. NewOpenRF
  124.     MOVEM.L    A0-A6/D1-D7,-(SP)    ;Save all regs. except D0
  125.     LEA    OldOpenRFAdr,A2        ;Get the old trap
  126.     MOVE.L    (A2),A2
  127.     JSR    (A2)            ;Do old trap
  128.     MOVEM.L    (SP)+,A0-A6/D1-D7    ;Restore regs.
  129.     
  130.     CMP.W    #fnfErr,D0        ;File Not Found Error in old WD?
  131.     BNE.S    NoORFErr        ;No, just return
  132.  
  133.     MOVE.W    ioVRefNum(A0),-(SP)    ;Save old RefNum
  134.     MOVE.W    D0,-(SP)        ;Save old Error
  135.     MOVEM.L    A0-A6/D1-D7,-(SP)    ;Save regs.
  136.     
  137.     MOVE.W    WDRefNum,ioVRefNum(A0)    ;Try our WD 
  138.     LEA    OldOpenRFAdr,A2        ;Get the old trap
  139.     MOVE.L    (A2),A2
  140.     JSR    (A2)            ;Do old trap in our Folder
  141.     
  142.     MOVEM.L    (SP)+,A0-A6/D1-D7    ;Restore regs.
  143.     
  144.     TST.W    D0            ;Error in new WD?
  145.     BEQ.S    @1            ;No, Clean up and return
  146.     MOVE.W    (SP),D0            ;Restore old Error
  147.     MOVE.W    2(SP),ioVRefNum(A0)    ;Restore old VRefNum
  148. @1    ADDQ    #4,SP            ;Clean Stack
  149.  
  150. NoORFErr
  151.     RTS
  152.  
  153.  
  154.  
  155. ;Patch to the _GetFileInfo trap
  156.  
  157. NewGetFI
  158.     LEA    Recursive,A1
  159.     ADD.W    #1,(A1)
  160.     
  161.     MOVEM.L    A0-A6/D1-D7,-(SP)    ;Save all regs. except D0
  162.     LEA    OldGetFIAdr,A2        ;Get the old trap
  163.     MOVE.L    (A2),A2
  164.     JSR    (A2)            ;Do old trap
  165.     MOVEM.L    (SP)+,A0-A6/D1-D7    ;Restore original regs.
  166.     
  167.     CMP.W    #fnfErr,D0        ;File Not Found Error?
  168.     BNE.S    NoGFIErr        ;No, just return
  169.     
  170.     TST.W    ioFDirIndex(A0)        ;Is this an indexed GetFileInfo?
  171.     BLE.S    NoGFIErr        ;No, just return
  172.     LEA    Recursive,A1
  173.     CMP.W    #1,(A1)            ;Recursive call?
  174.     BGT.S    NoGFIErr        ;Yes, just return
  175.     
  176.     JSR    CheckBlFolder        ;Are we looking at the blessed folder?
  177.     BNE.S    NoGFIErr        ;No, just return
  178.  
  179.     MOVE.W    ioVRefNum(A0),-(SP)    ;Save old RefNum
  180.     MOVE.W    D0,-(SP)        ;Save old Error
  181.     MOVE.W    ioFDirIndex(A0),-(SP)    ;Save the wanted FileIndex
  182.     
  183.     
  184. ;Find out how many files in old WD, to adjust FileIndex
  185.  
  186.         CLR.W   ioFDirIndex(A0)        ;Initialize FileIndex
  187. nextFile
  188.         ADD.W    #$1,ioFDirIndex(A0)    ;Next FileIndex
  189.  
  190.     MOVEM.L    A0-A6/D1-D7,-(SP)    ;Save regs.
  191.     LEA    OldGetFIAdr,A2        ;Get the old trap         
  192.     MOVE.L    (A2),A2
  193.     JSR    (A2)            ;Do old trap
  194.     MOVEM.L    (SP)+,A0-A6/D1-D7    ;Restore regs.
  195.     
  196.     TST.W    D0            ;FileIndex too large (File not found)?
  197.         BEQ.S    nextFile        ;Not yet, try next index
  198.     
  199.     
  200.     CMP.W    #fnfErr,D0        ;File Not Found Error in old WD?
  201.     BNE.S    OldError        ;No, Some other error, just return
  202.  
  203.     MOVE.W    (SP),D0            ;Get wanted FileIndex
  204.     SUB.W    ioFDirIndex(A0),D0    ;Adjust wanted FileIndex to our WD
  205.     ADD.W    #1,D0
  206.     MOVE.W    D0,ioFDirIndex(A0)    ;Set FileIndex in Param Block
  207.     MOVE.W    WDRefNum,ioVRefNum(A0)    ;Point to our WD
  208.     
  209.     MOVEM.L    A0-A6/D1-D7,-(SP)    ;Save regs.
  210.     LEA    OldGetFIAdr,A2        ;Get the old trap 
  211.     MOVE.L    (A2),A2
  212.     JSR    (A2)            ;Do old trap
  213.     MOVEM.L    (SP)+,A0-A6/D1-D7    ;Restore regs.
  214.     
  215.     TST.W    D0            ;Error in new WD?
  216.     BEQ.S    Cleanup            ;No, Clean up and return
  217. OldError
  218.     MOVE.W    (SP),ioFDirIndex(A0)    ;Restore old Index
  219.     MOVE.W    2(SP),D0        ;Restore old Error
  220.      MOVE.W    4(SP),ioVRefNum(A0)    ;Restore old VRefNum
  221. Cleanup
  222.     ADDQ    #6,SP            ;Clean Stack
  223.  
  224.  
  225. NOGFIErr
  226.     LEA    Recursive,A1
  227.     SUB.W    #1,(A1)            ;Clear Recursive flag
  228.  
  229.     RTS
  230.  
  231.  
  232. ;Subroutine to check if ioVRefNum(A0) is pointing to the blessed folder
  233.  
  234. CheckBlFolder
  235.     MOVEM.L    A0-A6/D0-D7,-(SP)    ;Save regs.
  236.     LINK    A6,#-ioHFQElSiz        ;Allocate a ParamBlock Record
  237.  
  238.     MOVE.L    A0,A1
  239.     LEA    -ioHFQElSiz(A6),A0    ;Point to Params
  240.     CLR.L    ioCompletion(A0)
  241.     CLR.L    ioFileName(A0)        ;Clear name pointer
  242.     TST.W    ioVRefNum(A1)        ;Default Directory?
  243.     BEQ.S    @2            ;Yes, get Default Directory info
  244.     MOVE.W    ioVRefNum(A1),ioVRefNum(A0)
  245.     CLR.W    ioWDIndex(A0)
  246.     CLR.L    ioWDProcID(A0)
  247.     CLR.W    ioWDVRefNum(A0)
  248.     _GetWDInfo            ;Get Working Directory info
  249.     BRA.S    @3
  250. @2    _HGetVol            ;Get Default Directory info        
  251. @3    BNE.S    @1
  252.     MOVE.L    BlDirID,D0
  253.     CMP.L    ioWDDirID(A0),D0    ;Is it the DirID of the blessed folder?
  254.     BNE.S    @1            ;No, return
  255.      MOVE.W    BlVRefNum,D0
  256.      CMP.W    ioWDVRefNum(A0),D0    ;Is it the VRefNum of blessed folder?
  257.  
  258. @1
  259.     UNLK    A6            ;Clean up stack
  260.     MOVEM.L    (SP)+,A0-A6/D0-D7    ;Restore regs.
  261.     RTS
  262.     
  263.     
  264. OldOpenAdr
  265.     DC.L    0            ;Saved old _Open address
  266. OldOpenRFAdr
  267.     DC.L    0            ;Saved old _OpenRF address
  268. OldGetFIAdr
  269.     DC.L    0            ;Saved old _GetFileInfo address
  270. WDRefNum
  271.     DC.W    0            ;The WDRefNum of our Folder
  272. BlVRefNum
  273.     DC.W    0            ;Volume reference number of blessed folder
  274. BlDirID
  275.     DC.L    0            ;Directory ID of blessed folder
  276. Recursive
  277.     DC.W    0            ;Recursion flag
  278.     
  279.     END
  280.